<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>

    /** js数据类型
     * ECMAScript规范
     * '原始值'类型（基本数据类型/值类型）
     *
     * 基本数据类型：
     * Symobl(Es6) 唯一值
     * Number(数字)：NaN\Infinity/正常数字
     * String(字符串)：正常字符串/模板字符串（``）
     * Boolean(布尔值)：true/false
     * Null:空 返回[object] 理解：已经声明且进入存储区但是没有赋值
     * Undefined:未定义
     * bigInt:大数
     * 引用数据类型：
     * Object(对象) : {}
     * Array(数组) : []
     * Function (函数类型（可执行对象）)
     * RegExp(正则/^$/)
     * new Date(日期)
     */


    // 区别 ：基本类型只是存储了一个值，引用数据类型只是引用了一个内存地址



    /**数据类型判断
     * typeOf 判断基本数据类型
     * instanceof 判断new关键字创建出来的引用数据类型
     * constructor 可以应对基本、引用数据类型
     * Object.prototype.toString.call() 完美解决方案
     * jquery.type 如果是null或者undefined则返回相应的数据类型
     *
     * object是js中所有数据的  基类
     *
     *ECMA规范里 所有可以调用call方法的都可以认为是一个“可执行对象”（例如 function 箭头函数 构造函数 生成器函数-------------》重点
     * typeof检测基本数据类型，返回数据类型 除了（null-》'object'
     * typeof检测对象数据类型，除了可执行对象返回“function”,其余都是object---------------》重点
     *
     * typeof null 检测为啥返回object (初级面试题)
     * 原因：
     * 1、浏览器是由c++语言编写出来的 所以用js的形式浏览器需要转换成c++语言
     * 2、所有数据类型，在计算机中都是以二进制值的方式存储的（
     * 例如：
     * 整数：1，浮点数：101，字符串：100，布尔：110，对象：000，undefined:-2^30,null:000000
     *
     * typeof底层原理机制就是判断这些二进制，如果是以000开头 那么根据：'排除函数'返回就是'object'
     * typeof稳定性和性能是最好的 用起来也很简单，所以经常用
     *
     */
</script>